package com.leyou.item.service;



import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.leyou.common.pojo.PageResult;
import com.leyou.item.mapper.BrandMapper;
import com.leyou.item.pojo.Brand;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

@Service
public class BrandService {

    @Autowired
    private BrandMapper brandMapper;

    public PageResult<Brand> queryBrandByPage(Integer page, Integer rows,String sortBy,Boolean desc,String key){

        //开启分页
        PageHelper.startPage(page,rows);

        //创建mybatis中的example对象，用于添加条件，where条件查询语句，相当于where后面的部分
        Example example = new Example(Brand.class);
        //生成example的where语句,每一个criteria就是where的子查询条件
        //Example.Criteria criteria = example.createCriteria();

        //判断是否有排序条件
        //Java里面判断不为空需要先判断不为0，再判断不为空字符串，而StringUtils.isNotBlank只需判断不为空即可
        if (StringUtils.isNotBlank(sortBy)){
           //查询条件   criteria
          // criteria.equals();
          //相当于写好了order by,只需要加入排序字段以及排序方式就可以了，比如 order by id desc
            example.setOrderByClause(sortBy+(desc ? " DESC":" ASC"));
         }

         //过滤
         //思路：当我们需要进行查询的时候，我们就要有条件，有条件就需要有where子句，这就要联想到mybatis的实例example的criteria对象
         //通过criteria的andEqualTo进行比较，是否相符
        Example.Criteria criteria = example.createCriteria();

        //StringUtils一步进行非空判断
        if (StringUtils.isNotBlank(key)){
            criteria.andEqualTo("letter",key);
        }

        //select为null，没有条件查询，代表是查询所有的品牌
        //return  this.brandMapper.select(null);

        //List<Brand> brands = this.brandMapper.select(null);

        //PageInfo动态的查询出总条目数，以及计算出总页数
        //PageInfo brandPageInfo = new PageInfo(brands);

        //用到了强制类型转换
        Page<Brand> brandPage = (Page<Brand>)this.brandMapper.selectByExample(example);

        //当brandPage.getPages()拿到的是int类型的，而PageResult需要的是Long类型，ctrl+P可以看到所需的类型
        //解决办法：装箱机制  所需值的类型与实际写的值的类型不一样，进行装箱，在实际填写值的外面添加new Long(),new一个所需的类型
        return  new PageResult<>(brandPage.getTotal(),new Long(brandPage.getPages()),brandPage);
    }

    //操作两张表，或者是多张表，需要添加事务的管理
    @Transactional
    public void saveBrand(Brand brand, List<Long> cids) {

        //保存品牌，主键回显
        this.brandMapper.insertSelective(brand);

        //前台发送ajax请求到后台，cids是字符串，在springmvc处理后会将字符串转为数组，cids是数组，需要迭代遍历取得每一个的值
        //循环保存分类以及品牌之间的关系
        cids.forEach(cid->this.brandMapper.insertCategoryBrand(cid,brand.getId()));

    }
}